package com.jt;

import com.alibaba.cloud.nacos.ribbon.NacosRule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author SWJ
 * @create 2021-08-17 10:49
 */
@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

    /**
     * RestTemplate对象进行远程服务调用(RPC)把交给spring管理*
     * 创建restTemplate
     * 方法中对象传给spring 管理 添加@Bean进行管理注入
     * 创建
     * private RestTemplate restTemplate;
     * 后面常用进行调用底层restTemplate
     * 下面返回的return restTemplate.getForObject(url, String.class);
     */

    @Bean
    public RestTemplate restTemplate() {
        //spring 提供一个服务restTemplate池
        return new RestTemplate();
    }


    @RestController
    public class ConsumerController {
        @Value("${spring.application.name}")
        private String appName;
        //访问
        //http://localhost:8088/consumer/doRestEcho1

        @Autowired
        private RestTemplate restTemplate;
        //后面常用进行调用底层restTemplate

        @GetMapping("/consumer/doRestEcho1")
        public String doRestEcho01() {
            //        /**public String doRestEcho01(@PathVatiable){是加入的jdk8的说明
            //         * 调用的是sca-provider 中的一个url
            //         * */
            //        String url = "http://localhost:8080/provider/echo/" + appName;
            //        //这样端口写死会有问题 有弊端
            //        System.out.println("request url:" + url);
            //        return restTemplate.getForObject(url, String.class);
            //        //url返回的地址返回给客户端

            //手动自己写负载均衡算法(随机调用服务列表中的服务对象)
            //调用谁?sca-provider中的一个url
//            String url1="http://localhost:8080/provider/echo/"+appName;
//            String url2="http://localhost:8081/provider/echo/"+appName;
//            String url3="http://localhost:8082/provider/echo/"+appName;
//            String urls[]=new String[]{url1,url2,url3};
//            //随机获取一个小于urls数组长度的整数
//            int n=new Random().nextInt(urls.length);
//            System.out.println("n="+n);
//            //如何调用?
//            return restTemplate.getForObject(urls[n],String.class);

            String url="http://localhost:8081/provider/echo/"+appName;
            return restTemplate.getForObject(url,String.class);
        }
        //负载均衡方式的调用1
        @GetMapping("/consumer/doRestEcho2")
        public String doRestEcho2(){
            //基于loadBalancerClient方式获取服务实例
            String serviceId="sca-provider";
            //这个名字要在nacos的服务列表中
            NacosRule loadBalancerClient = null;
            ServiceInstance choose = (ServiceInstance) loadBalancerClient.choose(serviceId);
            String ip=choose.getHost();
            int port=choose.getPort();
            //String url="http://"+ip+":"+port+"/provider/echo/"+appName;
            //String url="http://"+ip+":"+port+"/provider/echo/"+appName;
            String url=String.format("http://%s:%s/provider/echo/%s",ip,port,appName);
            return restTemplate.getForObject(url,String.class);
        }

        @GetMapping("/consumer/doRestEcho3")
        public String doRestEcho3(){
            String serviceId="sca-provider";
            String url=String.format("http://%s/provider/echo/%s",serviceId,appName);
            RestTemplate loadBalanceRestTemplate = null;
            return loadBalanceRestTemplate.getForObject(url,String.class);
        }
    }


}
